<?php
//
//namespace HashyooSwoole\Websocket\Middleware;
//
//use Closure;
//use Illuminate\Contracts\Encryption\DecryptException;
//use Illuminate\Contracts\Encryption\Encrypter as EncrypterContract;
//use Symfony\Component\HttpFoundation\Request;
//
///**
// * Class DecryptCookies
// */
//class DecryptCookies
//{
//    /**
//     * The encrypter instance.
//     *
//     * @var \Illuminate\Contracts\Encryption\Encrypter
//     */
//    protected $encrypter;
//
//    /**
//     * The names of the cookies that should not be encrypted.
//     *
//     * @var array
//     */
//    protected $except = [];
//
//    /**
//     * Indicates if cookies should be serialized.
//     * Serialization is disabled after Laravel 5.6.3
//     *
//     * @var bool
//     */
//    protected static $serialize = false;
//
//    /**
//     * Create a new CookieGuard instance.
//     *
//     * @param  \Illuminate\Contracts\Encryption\Encrypter $encrypter
//     *
//     * @return void
//     */
//    public function __construct(EncrypterContract $encrypter)
//    {
//        $this->encrypter = $encrypter;
//    }
//
//    /**
//     * Disable encryption for the given cookie name(s).
//     *
//     * @param  string|array $name
//     *
//     * @return void
//     */
//    public function disableFor($name)
//    {
//        $this->except = array_merge($this->except, (array) $name);
//    }
//
//    /**
//     * Handle an incoming request.
//     *
//     * @param  \Illuminate\Http\Request $request
//     * @param  \Closure $next
//     *
//     * @return \Symfony\Component\HttpFoundation\Response
//     */
//    public function handle($request, Closure $next)
//    {
//        return $next($this->decrypt($request));
//    }
//
//    /**
//     * Decrypt the cookies on the request.
//     *
//     * @param  \Symfony\Component\HttpFoundation\Request $request
//     *
//     * @return \Symfony\Component\HttpFoundation\Request
//     */
//    protected function decrypt(Request $request)
//    {
//        foreach ($request->cookies as $key => $cookie) {
//            if ($this->isDisabled($key)) {
//                continue;
//            }
//
//            try {
//                $request->cookies->set($key, $this->decryptCookie($key, $cookie));
//            } catch (DecryptException $e) {
//                $request->cookies->set($key, null);
//            }
//        }
//
//        return $request;
//    }
//
//    /**
//     * Decrypt the given cookie and return the value.
//     *
//     * @param  string $name
//     * @param  string|array $cookie
//     *
//     * @return string|array
//     */
//    protected function decryptCookie($name, $cookie)
//    {
//        return is_array($cookie)
//            ? $this->decryptArray($cookie)
//            : $this->encrypter->decrypt($cookie, static::serialized($name));
//    }
//
//    /**
//     * Decrypt an array based cookie.
//     *
//     * @param  array $cookie
//     *
//     * @return array
//     */
//    protected function decryptArray(array $cookie)
//    {
//        $decrypted = [];
//
//        foreach ($cookie as $key => $value) {
//            if (\is_string($value)) {
//                $decrypted[$key] = $this->encrypter->decrypt($value, static::serialized($key));
//            }
//        }
//
//        return $decrypted;
//    }
//
//    /**
//     * Determine whether encryption has been disabled for the given cookie.
//     *
//     * @param  string $name
//     *
//     * @return bool
//     */
//    public function isDisabled(string $name)
//    {
//        return \in_array($name, $this->except);
//    }
//
//    /**
//     * Determine if the cookie contents should be serialized.
//     *
//     * @param string $name
//     *
//     * @return bool
//     */
//    public static function serialized(string $name)
//    {
//        return static::$serialize;
//    }
//}
